// base_detector.hpp
#ifndef HERO_INTEGRATED_VISION_BASE_DETECTOR_HPP
#define HERO_INTEGRATED_VISION_BASE_DETECTOR_HPP

#include <opencv2/opencv.hpp>
#include <rclcpp/rclcpp.hpp>
#include "hero_integrated_vision/armor.hpp"  // 包含Armor结构体定义

namespace rm_aim
{
/**
 * @brief 基础检测器类，定义装甲板检测的通用接口和基础成员
 * @details 作为所有具体检测器的基类，提供初始化、检测等纯虚函数接口，
 *          并维护通用参数（日志器、置信度阈值等）
 */
class BaseDetector
{
public:
  /**
   * @brief 构造函数，初始化通用参数（日志器、置信度阈值等）
   * @param logger 日志器对象
   * @param conf_threshold 置信度阈值，默认值为0.5
   */
  BaseDetector(const rclcpp::Logger & logger, double conf_threshold = 0.5)
    : logger_(logger), conf_threshold_(conf_threshold) {}

  /**
   * @brief 初始化函数，加载模型并配置设备参数
   * @param model_path 模型文件路径
   * @param device 运行设备（默认"CPU"）
   * @return 是否初始化成功（true为成功）
   */
  virtual bool init(const std::string& model_path, const std::string& device = "CPU") = 0;

  /**
   * @brief 核心检测接口，对输入图像进行装甲板检测
   * @param rgb_image 输入图像（cv::Mat格式）
   * @param use_roi 是否使用ROI区域进行检测优化
   * @return 检测到的装甲板列表（std::vector<Armor>）
   */
  virtual std::vector<Armor> detect(const cv::Mat& rgb_image) = 0;

  /**
   * @brief 检测并绘制装甲板结果
   * @param img 输入图像（cv::Mat格式）
   */
  virtual void drawArmorDetectionResults(cv::Mat &img) = 0; 

  /**
   * @brief 检查检测器是否已完成初始化
   * @return 初始化状态（true表示已就绪）
   */
  virtual bool isReady() const = 0;

  /**
   * @brief 虚析构函数，确保派生类析构函数能正确调用
   */
  virtual ~BaseDetector() = default;

protected:
  rclcpp::Logger logger_;  // 共享日志器，用于输出日志信息
  double conf_threshold_;  // 置信度阈值（通用参数），过滤低置信度检测结果
  bool is_initialized_ = false;  // 初始化状态标识（true表示已完成初始化）
};

}  // namespace rm_aim
#endif